package com.itlong.cloud.app.dao;

import com.itlong.cloud.POJO.PO.FeedbackInfoPO;
import com.itlong.cloud.POJO.VO.property.PropertyQrcodeValidVO;
import com.itlong.cloud.POJO.PO.AppTempSaveMessagePO;
import com.itlong.cloud.POJO.PO.AppUserInfoPO;
import com.itlong.cloud.POJO.VO.app.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      APP的我版块数据访问接口。
 * <desc/>
 *
 * @createDate 2017/11/10.
 */
@Mapper
@Repository
public interface IAppMineDao {

    /**
     * <dewc>
     *      删除小程序用户信息
     * </dewc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/17
     */
    void deleteMiniUserName(@Param("userId") String userId);

    /**
     * <desc>
     *      注销用户项目信息
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    void setLogOffUserProjectByUserId(@Param("userId") String userId);


    /**
     * <desc>
     *      注销用户在指定项目的人脸信息
     * </desc>
     *
     * @param userId
     * @param projectId
     * @author Juguang.S
     * @createDate 2021/04/21
     */
    void deleteFaceInfoByUserId(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      注销用户房间信息
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    void setLogOffUserRoomByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *     注销用户电梯权限
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    void setLogOffUserElevatorByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      注销用户门禁权限
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    void setLogOffUserEntranceByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      注销用户云对讲权限
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    void setLogOffUserCloudIntercomByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      根据userId获取用户信息
     * </desc>
     *
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2020/06/11
     */
    AppUserInfoPO getUserInfoByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      注销账号
     * </desc>
     *
     * @param userId
     * @author Jiaqi.X
     * @createDate 2020/06/01
     */
    void logOff(@Param("userId") String userId);

    /**
     * <desc>
     *      注销账号SDK
     * </desc>
     *
     * @param userId
     * @author Qiang.S
     * @createDate 2020/07/02
     */
    void logOffForSDK(@Param("userId") String userId);

     /**
      * <desc>
      *      获取家人授权列表。
      * <desc/>
      *
      * @param  param
      * @return
      * @author shengen.T
      * @createDate 2017/11/10
      */
    List<AppMineGetAuthPersonPageVO> getAuthPersonPage(Map<String,Object> param);

     /**
      * <desc>
      *      获取家人地址。
      * <desc/>
      *
      * @param parentUserId 业主用户Id
      * @param userId 家人Id
      * @param projectId 项目ID
      * @return
      * @author shengen.T
      * @createDate 2017/11/10
      */
    List<AppMineGetAddressInfoVO> getAddressInfo(@Param("parentUserId") String parentUserId, @Param("userId") String userId, @Param("projectId") String projectId);

     /**
      * <desc>
      *      获取家人列表总数。
      * <desc/>
      *
      * @param  param
      * @return
      * @author shengen.T
      * @createDate 2017/11/10
      */
    Integer getPageCount(Map<String,Object> param);


     /**
      * <desc>
      *      获取用户ID。
      * <desc/>
      *
      * @param phoneNo 手机号码
      * @return 返回用户ID
      * @author shengen.T
      * @createDate 2017/11/13
      */
     AppUserInfoPO getUserInfoByPhoneNo(@Param("phoneNo") String phoneNo);

     /**
      * <desc>
      *      检测人在不在人跟项目关系表里。
      * <desc/>
      *
      * @param  userId 用户编号
      * @param  projectId 项目编号
      * @return 返回记录数
      * @author shengen.T
      * @createDate 2017/11/13
      */
    Integer checkUsrProject(@Param("userId") String userId,@Param("projectId") String projectId);


     /**
      * <desc>
      *      获取人是否存在人和房间关系表中部分信息。
      * <desc/>
      *
      * @param  userId 用户ID
      * @param  projectId 项目ID
      * @param  roomId 房间唯一ID
      * @return
      * @author shengen.T
      * @createDate 2017/11/14
      */
    AppUserRoomPartVO getUserRoomPortInfo(@Param("userId") String userId, @Param("projectId") String projectId, @Param("roomId") String roomId);

    /**
     * <desc>
     *      检测人是否存在人和房间关系表中是否迁出状态。
     * <desc/>
     *
     * @param  userId 用户ID
     * @param  projectId 项目ID
     * @param  roomId 房间唯一ID
     * @return
     * @author shengen.T
     * @createDate 2017/11/14
     */
    Integer checkUserRoomMoveStatus(@Param("userId") String userId, @Param("projectId") String projectId,@Param("roomId") String roomId);

    /**
     * <desc>
     *      通过房间ID获取房间信息。
     * <desc/>
     *
     * @param  roomIdList 房间ID列表
     * @return
     * @author shengen.T
     * @createDate 2017/11/14
     */
    List<AppMineRoomInfoVO> getRoomInfoList(@Param("roomIdList") String[] roomIdList);

     /**
      * <desc>
      *      批量删除用户授权关系表。
      * <desc/>
      *
      * @param  projectId 项目
      * @param  userId 邀请人的ID
      * @param  parentId 业主
      * @return 返回影响行数
      * @author shengen.T
      * @createDate 2017/11/14
      */
    Integer deleteAuthRelations(@Param("projectId") String projectId,@Param("userId") String userId, @Param("parentId") String parentId,@Param("roomId") String roomId);

    /**
     * <desc>
     *     获取用户备注。
     * <desc/>
     *
     * @param  projectId 项目
     * @param  userId 邀请人的ID
     * @param  parentUserId 业主
     * @return 返回用户备注信息
     * @author shengen.T
     * @createDate 2017/11/14
     */
    String getUserRemark(@Param("projectId") String projectId,@Param("userId") String userId, @Param("parentUserId") String parentUserId);

     /**
      * <desc>
      *     获取被授权人拥有房间ID。
      * <desc/>
      *
      * @param  projectId 项目
      * @param  userId 邀请人的ID
      * @param  parentUserId 业主ID
      * @return 返回房间ID列表
      * @author shengen.T
      * @createDate 2017/11/15
      */
    List<AppMineRoomInfoVO> getAuthRelationsRoomInfos(@Param("projectId") String projectId,@Param("userId") String userId, @Param("parentUserId") String parentUserId );

     /**
      * <desc>
      *      设置用户和房间关系信息状态。
      * <desc/>
      *
      * @param  projectId 项目
      * @param  userId 邀请人的ID
      * @param  roomId 房间ID
      * @param  status 状态 2迁入 3迁出
      * @author shengen.T
      * @createDate 2017/11/15
      */
//    Integer setUserRoomStatus(@Param("projectId") String projectId,
//                              @Param("userId") String userId,
//                              @Param("roomId") String roomId ,
//                              @Param("status") Integer status);

    /**
     * <desc>
     *      更新用户备注信息。
     * <desc/>
     *
     * @param  projectId 项目
     * @param  userId 邀请人的ID
     * @param  parentUserId 业主ID
     * @param  userRemarks 备注信息
     * @return
     * @author shengen.T
     * @createDate 2017/11/15
     */
    Integer updateUserRemark(@Param("projectId") String projectId,
                             @Param("userId") String userId,
                             @Param("parentUserId") String parentUserId,
                             @Param("userRemarks") String userRemarks
    );

    /**
     * <desc>
     *      获取用户二维码
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/15
     */
    AppGetQrcodeVO getUserQrcode(@Param("projectId") String projectId,@Param("userId") String userId);


     /**
      * <desc>
      *      获取用户在该项目该业主下是否授权过房间的数目。
      * <desc/>
      *
      * @param  parentUserId 业主ID
      * @param  userId 用户ID
      * @param  projectId 项目ID
      * @return
      * @author shengen.T
      * @createDate 2017/11/23
      */
    Integer getUserAuthRelationCount(@Param("parentUserId") String parentUserId,@Param("userId") String userId,@Param("projectId") String projectId);

     /**
      * <desc>
      *      获取对应项目的业主拥有的最大授权数。
      * <desc/>
      *
      * @param  projectId 项目ID
      * @return 返回最大授权数
      * @author shengen.T
      * @createDate 2017/11/23
      */
    Integer getMaxAuthNum(@Param("projectId") String projectId);


     /**
      * <desc>
      *      检测该业主是否存在该项目编号。
      * <desc/>
      *
      * @param  userId 用户编号
      * @param  projectId 项目编号
      * @return
      * @author shengen.T
      * @createDate 2017-11-28
      */
    Integer checkProjectId(@Param("userId") String userId,@Param("projectId") String projectId);

     /**
      * <desc>
      *      获取业主开门密码。
      * <desc/>
      *
      * @param  userId 用户编号
      * @param  projectId 项目编号
      * @param  roomId 房间编号
      * @return
      * @author shengen.T
      * @createDate 2017-12-06
      */
    String getOpenPassword(@Param("userId") String userId,@Param("projectId") String projectId,@Param("roomId") String roomId);

     /**
      * <desc>
      *      更新用户房间信息。
      * <desc/>
      *
      * @param  params
      * @return
      * @author shengen.T
      * @createDate 2017-12-06
      */
    Integer updateUserRoomInfo(Map<String,Object> params);


    /**
     * <desc>
     *      更新用户房间信息。
     * <desc/>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param roomId 房间编号
     * @param openPwd 开门密码
     * @return
     * @author shengen.T
     * @createDate 2017-12-07
     */
    Integer updateUserRoomOpenPwd(@Param("userId") String userId,
                                  @Param("projectId") String projectId,
                                  @Param("roomId") String roomId,
                                  @Param("openPwd") String openPwd);


     /**
      * <desc>
      *      设置用户项目关系表状态。
      * <desc/>
      *
      * @param userId 用户编号
      * @param projectId 项目编号
      * @param status 状态
      * @return
      * @author shengen.T
      * @createDate 2017-12-07
      */
    Integer setUserProjectStatus(@Param("userId") String userId,
                                 @Param("projectId") String projectId,
                                 @Param("status") Integer status);

     /**
      * <desc>
      *      检测用户在某个项目下是否有房间信息。
      * <desc/>
      *
      * @param userId 用户编号
      * @param projectId 项目编号
      * @return
      * @author shengen.T
      * @createDate 2017-12-07
      */
    Integer checkUserRoomCount(@Param("userId") String userId,
                               @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取房间名称。
     * <desc/>
     *
     * @param roomId 房间编号
     * @param projectId 项目编号
     * @return
     * @author shengen.T
     * @createDate 2017-12-14
     */
    String getRoomName(@Param("projectId") String projectId,
                       @Param("roomId") String roomId);

    /**
     * <desc>
     *      获取房间入住人数。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @param  userId 用户ID
     * @param  roomId 房间编号
     * @return
     * @author shengen.T
     * @createDate 2017-12-14
     */
    Integer getUserRoomCount(@Param("userId")String userId,@Param("projectId") String projectId,@Param("roomId") String roomId);

    /**
     * <desc>
     *      获取房间入住人数。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @param  roomId 房间编号
     * @return
     * @author shengen.T
     * @createDate 2017-12-14
     */
    Integer getUserRoomCount(@Param("projectId") String projectId,@Param("roomId") String roomId);

     /**
      * <desc>
      *      更新用户信息状态。
      * <desc/>
      *
      * @param  userId 用户ID
      * @param  status 1启用 2禁用 0删除
      * @return
      * @author shengen.T
      * @createDate 2018-01-15
      */
    Integer updateUserInfoStatus(@Param("userId") String userId,@Param("status") Integer status);


     /**
      * <desc>
      *      获取用户项目状态。
      * <desc/>
      *
      * @param  userId
      * @param  projectId
      * @return
      * @author shengen.T
      * @createDate 2018-01-16
      */
    Integer getUserProjectStatus(@Param("userId") String userId,@Param("projectId") String projectId);


    /**
     * <desc>
     *     获取用户标签
     * <desc/>
     *
     * @param  userId
     * @param  projectId
     * @return
     * @author pengwei
     * @createDate 2020-11-12
     */
    String getUserLabel(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目状态。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2019-01-07
     */
    String getProjectStatus(@Param("projectId") String projectId);

     /**
      * <desc>
      *      获取用户授权房间信息。
      * <desc/>
      *
      * @param  userId 被授权人ID
      * @param  projectId  项目ID
      * @param  parentUserId 业主用户ID
      * @return
      * @author shengen.T
      * @createDate 2018-01-17
      */
    List<AppAuthRelationsSimpleInfoVO> getAuthRelationsRoomIds(@Param("userId") String userId,
                                                            @Param("projectId") String projectId,
                                                            @Param("parentUserId") String parentUserId );
     /**
      * <desc>
      *      更新用户授权关系绑定信息信息。
      * <desc/>
      *
      * @param  userId 被授权人ID
      * @param  projectId  项目ID
      * @param  roomId  房间ID
      * @param  userRemarks 用户备注
      * @return
      * @author shengen.T
      * @createDate 2018-01-17
      */
    Integer updateAuthRelationInfo(@Param("userId") String userId,
                                   @Param("projectId") String projectId,
                                   @Param("roomId") String roomId,
                                   @Param("userRemarks") String userRemarks,
                                   @Param("createTime") Date createTime );

    /**
     * <desc>
     *      获取业主拥有权限的房间列表ID。
     * <desc/>
     *
     * @param userId 用户ID
     * @param projectId 项目ID
     * @return
     * @author shengen.T
     * @createDate 2018-02-02
     */
    List<String> getOwnerRoomInfoLists(@Param("userId") String userId, @Param("projectId") String projectId);


    /**
     * <desc>
     *      获取审核通过的房间列表。
     * <desc/>
     *
     * @param  params
     * @return
     * @author shengen.T
     * @createDate 2018-03-26
     */
    List<AppPassRoomListVO> getPassRoomPage(Map<String,Object> params);


    /**
     * <desc>
     *      获取审核通过的房间总记录数。
     * <desc/>
     *
     * @param  params
     * @return
     * @author shengen.T
     * @createDate 2018-03-26
     */
    Integer getPassRoomPageCount(Map<String,Object> params);

    /**
     * <desc>
     *      保存app端监听linPhone状态的数据
     * <desc/>
     * @param params app端传入数据
     * @return
     * @author Juguang.S
     * @createDate 2018/05/08
     */
    void save(Map<String, Object> params);

    /**
     * <desc>
     *  根据时间或手机号查询linPhone状态的数据
     * <desc/>
     *
     * @param findTime 传入查询时间
     * @param phoneNum 传入查询手机号
     * @return
     * @author Juguang.S
     * @createDate 2018/05/08
     */
    List<AppTempSaveMessagePO> findMessageBytime(@Param("findTime") String findTime,@Param("phoneNum") String phoneNum);

    /**
     * <desc>
     *  根据userId查询手机号
     * <desc/>
     *
     * @param userId
     * @return MessageVO 标准格式化响应结果
     * @author Juguang.S
     * @createDate 2018/05/08
     */
    String findPhoneNumByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      获取用户人脸创建信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @author Qiang.S
     * @createDate 2018/05/08
     */
    AppUserFaceVO getCreateBaiduFaceInfo(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      修改用户手机
     * </desc>
     *
     * @param userId 用户id
     * @param newPhoneNo 新手机号
     * @return
     * @author Qiang.S
     * @createDate 2018/07/03
     */
    Integer updateUserPhone(@Param("userId") String userId, @Param("newPhoneNo") String newPhoneNo);

    /**
     * <desc>
     *      查询出userId长度为32的userId
     * <desc/>
     *
     * @return
     * @author Juguang.S
     * @createDate 2018-08-24
     */
    List<Map<String,String>> getUserIdByLength();

    /**
     * <desc>
     *      更新userId长度为32的SIP账号
     * <desc/>
     * @author Juguang.S
     * @createDate 2018-08-24
     */
    void updateUserSipAccount(@Param("newSipAccount") String newSipAccount, @Param("projectId") String projectId, @Param("userId") String userId);

    /**
     * <desc>
     *      查询旧数据的所有用户信息
     * <desc/>
     * @author Juguang.S
     * @createDate 2018-08-24
     */
    List<Map<String,String>> getAppUserInfo();

    /**
     * <desc>
     *      查询所有的未禁用并且开启云对讲的项目编号
     * <desc/>
     * @author Juguang.S
     * @createDate 2018-08-24
     */
    List<String> getProjectid();

    /**
     * <desc>
     *      查询未创建灵云快智的sip信息
     * <desc/>
     *
     * @return
     * @author Juguang.S
     * @createDate 2018-10-15
     */
    List<Map<String,String>> remedySipAccount();

    /**
     * <desc>
     *      根据手机号查询sip信息
     * <desc/>
     *
     * @param  phoneNum 手机号
     * @return
     * @author Juguang.S
     * @createDate 2018-10-15
     */
    List<Map<String,String>> remedySipAccountByPhoneNum(@Param("phoneNum") String phoneNum);

    /**
     * <desc>
     *      由账单id查询项目微信公众号appId
     * <desc/>
     *
     * @return 项目微信公众号appId
     * @author wangzhi
     * @createDate 2019/10/23
     */
    Map<String, Object> getAppIdByBillId(@Param("billId") String billId);

    /**
     * <desc>
     *      根据房间id获取二维码配置信息
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/12
     */
    PropertyQrcodeValidVO getPropertyQrocdeVliadInfo(@Param("roomId") String roomId);

    /**
     * <desc>
     *      获取历史反馈列表
     * </desc>
     *
     * @param params 参数列表
     * @return
     * @Author Zhu.yj
     * @createDate  2020/11/12
     */
    List<AppFeedbackInfoVO> getFeedbackList(Map<String, Object> params);

    /**
     * <desc>
     *      获取反馈详情
     * </desc>
     *
     * @param feedbackId 反馈id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/11/12
     */
    FeedbackInfoPO getFeedbackDetail(@Param("feedbackId") String feedbackId);
    /**
     * <desc>
     *      注销用户项目信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/17
     */
    Integer setLogOffUserProject(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      注销用户项目下的电梯权限
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/17
     */
    Integer setLogOffUserElevator(@Param("userId") String userId, @Param("projectId") String projectId);
}
